import React from 'react';

/**
 * 通用的 Tooltip 生命周期管理 Hook
 *
 * 功能：在窗口/标签页生命周期事件（切换、失焦、隐藏等）时自动关闭 Tooltip
 * 避免 Tooltip 在用户离开页面后仍然残留在 DOM 中
 *
 * @param onClose - 关闭 Tooltip 的回调函数
 * @param enabled - 是否启用生命周期监听，默认为 true
 *
 * @example
 * ```tsx
 * const resetTooltip = () => setIsOpen(false);
 * useTooltipLifecycle(resetTooltip);
 * ```
 */
export const useTooltipLifecycle = (
    onClose: () => void,
    enabled: boolean = true
) => {
    React.useEffect(() => {
        // 如果未启用则跳过
        if (!enabled) return;

        // 统一的关闭处理函数
        const handleClose = () => onClose();

        // 标签页可见性变化（切换标签页）
        const onVisibilityChange = () => {
            if (document.hidden) handleClose();
        };

        // 窗口失焦/获焦事件（切换窗口或应用）
        const onBlur = () => handleClose();
        const onFocus = () => handleClose();

        // 页面显示/隐藏事件（bfcache 恢复，如前进/后退）
        const onPageShow = () => handleClose();
        const onPageHide = () => handleClose();

        // 鼠标离开浏览器窗口边界（relatedTarget === null 表示离开窗口）
        const onMouseOutWindow = (e: MouseEvent) => {
            if (!(e as any).relatedTarget) handleClose();
        };

        // 注册所有生命周期事件监听器
        window.addEventListener('blur', onBlur);
        window.addEventListener('focus', onFocus);
        window.addEventListener('pageshow', onPageShow);
        window.addEventListener('pagehide', onPageHide);
        window.addEventListener('mouseout', onMouseOutWindow);
        document.addEventListener('visibilitychange', onVisibilityChange);

        // 清理函数：移除所有事件监听器
        return () => {
            window.removeEventListener('blur', onBlur);
            window.removeEventListener('focus', onFocus);
            window.removeEventListener('pageshow', onPageShow);
            window.removeEventListener('pagehide', onPageHide);
            window.removeEventListener('mouseout', onMouseOutWindow);
            document.removeEventListener('visibilitychange', onVisibilityChange);
        };
    }, [onClose, enabled]);
};
